#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "arete.h"




Arete nouvelleArete(Noeud** chemin, int longueur, int poids)
{
	Arete a;

	a.chemin = chemin;
	a.longueur = longueur;
	a.poids = poids;

	return a;
}


void testamentArete(Arete* a)
{
	if ((a->chemin) != NULL)
	{
		free(a->chemin);
	}

	a->chemin = NULL;
	a->longueur = 0;
	a->poids = 0;
}



Noeud* getCheminIArete(Arete* a, const int i)
{
	return a->chemin[i];
}


int getLongueurArete(const Arete* a)
{
	return a->longueur;
}


int getPoidsArete(const Arete* a)
{
	return a->poids;
}


void setCheminIArete(Arete* a, Noeud* n, const int i)
{
	a->chemin[i] = n;
}


void setLongueurArete(Arete* a, const int longueur)
{
	a->longueur = longueur;
}


void setPoidsArete(Arete* a, const int poids)
{
	a->poids = poids;
}



void affichageAreteTexte(const Arete* a)
{
	printf("Arete de longueur %d et de poids %d\n", a->longueur, a->poids);
}


int testEgalesAretes(const Arete* a1, const Arete* a2)
{
	int i;

	if ((a1->poids != a2->poids) || (a1->longueur != a2->longueur))
	{
		return 0;
	}
	else
	{
		for (i=0;i<a1->longueur;i++)
		{
			if (((a1->chemin)[i]) != ((a2->chemin)[i]))
			{
				return 0;
			}
		}
	}

	return 1;
}



int testArete()
{
	int i, j, longueur;
	Arete tabaretes[100];
	Arete a1, a2;
	Noeud tabnoeuds[100];
	Noeud** chemin;

	srand(time(NULL));

	printf("\nTEST DU MODULE ARETE\n");

	for(i=0;i<100;i++)
	{
		tabnoeuds[i] = nouveauNoeud("",0,0,i);
	}

	printf("\nTest de la fonction d'initialisation\n");
	for(i=0;i<100;i++)
	{
		longueur = rand()%9+2;
		chemin = malloc(longueur*sizeof(Noeud*));
		for(j=0;j<longueur;j++)
		{
			chemin[j] = &tabnoeuds[rand()%100];
		}
		tabaretes[i] = nouvelleArete(chemin,longueur,10*i);
	}
	printf("OK\n");

	printf("\nTest des accesseurs et mutateurs les moins triviaux\n");
	testamentArete(&tabaretes[0]);
	chemin = (Noeud**) malloc(50*sizeof(Noeud*));
	for(i=0;i<50;i++)
	{
		chemin[i] = &tabnoeuds[i];
	}
	a1 = nouvelleArete(chemin,50,1);

	for(i=0;i<50;i++)
	{
		assert(getCheminIArete(&a1,i) == &tabnoeuds[i]);
		for(j=0;j<100;j++)
		{
			if(j!=i)
			{
				assert(getCheminIArete(&a1,i) != &tabnoeuds[j]);
			}
		}
	}

	for(i=0;i<50;i++)
	{
		setCheminIArete(&a1,&tabnoeuds[i+50],i);
	}

	for(i=0;i<50;i++)
	{
		assert(getCheminIArete(&a1,i) == &tabnoeuds[i+50]);
		for(j=0;j<100;j++)
		{
			if(j!=i+50)
			{
				assert((getCheminIArete(&a1,i) != &tabnoeuds[j]));
			}
		}
	}
	printf("OK\n");


	printf("\nTest de la fonction d'egalite\n");
	for(i=0;i<100;i++)
	{
		chemin = (Noeud**) malloc(getLongueurArete(&tabaretes[i])*sizeof(Noeud*));
		for(j=0;j<getLongueurArete(&tabaretes[i]);j++)
		{
			chemin[j] = getCheminIArete(&tabaretes[i],j);
		}
		a2 = nouvelleArete(chemin,getLongueurArete(&tabaretes[i]),getPoidsArete(&tabaretes[i]));
		assert(testEgalesAretes(&a2,&tabaretes[i]) == 1);
		assert(testEgalesAretes(&tabaretes[i],&tabaretes[i]) == 1);
		assert(testEgalesAretes(&a1,&tabaretes[i]) == 0);
		testamentArete(&a2);
	}	
	printf("OK\n");


	printf("\nTest de la fonction d'affichage\n");
	affichageAreteTexte(&a1);
	printf("OK\n");

	for(i=0;i<100;i++)
	{
		testamentArete(&tabaretes[i]);
	}
	testamentArete(&a1);
	testamentArete(&a2);

	printf("\nLe test est un succes.\n");
	return 0;
}



